package zpe.model;

import java.sql.Timestamp;
import java.util.Map;
import java.util.HashMap;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import zpe.genericcrud.model.Entidade;
import zpe.model.enums.Altura;
import zpe.model.enums.Bloco;
import zpe.model.enums.Linha;

@Entity
@Table(name = "tb_enderecamento_historico", schema = "dbo")
public class EnderecamentoHistorico implements Entidade {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4924428534623251899L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ci_enderecamento_historico")
	private Integer id;
	
	@Transient
	private String Descricao;
	
	@Column(name = "ds_localizacao")
	private String localizacao;
	
	@Column(name = "dt_movimentacao")
	private Timestamp dataMovimentacao;
	
	@OneToOne
	@JoinColumn( name = "cd_enderecamento" , nullable = false)
	private Enderecamento enderecamento = new Enderecamento();
	
	@OneToOne
	@JoinColumn( name = "cd_local" , nullable = false)
	private Local local = new Local();
	
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "ds_altura")
	private Altura altura;
	
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "ds_bloco")
	private Bloco bloco;
	
	@Enumerated(EnumType.ORDINAL)
	@Column(name = "ds_linha")
	private Linha linha;
	
	@Column(name = "nr_coluna")
	private String coluna;
	
	public EnderecamentoHistorico(){
	}
	
	public Integer getId() {
		return id;
	}

	public String getLocalizacao() {
		localizacao = "";
		if(getBloco()!=null)
			localizacao += getBloco().toString();
		
		if(getLinha()!=null)
			localizacao += getLinha().toString();
		
		if(coluna!=null){
			if(coluna.length()==1)
				localizacao += "000"+coluna;
			else if(coluna.length()==2)
				localizacao += "00"+coluna;
			else if(coluna.length()==3)
				localizacao += "0"+coluna;
			else if(coluna.length()==4)
				localizacao += coluna;
		}
		if(getAltura()!=null)
			localizacao += getAltura().toString();
		
		return localizacao;
	}

	public void setLocalizacao(String localizacao) {
		this.localizacao = localizacao;
	}

	public Timestamp getDataMovimentacao() {
		return dataMovimentacao;
	}

	public void setDataMovimentacao(Timestamp dataMovimentacao) {
		this.dataMovimentacao = dataMovimentacao;
	}

	public Local getLocal() {
		return local;
	}

	public void setLocal(Local local) {
		this.local = local;
	}

	public Altura getAltura() {
		return altura;
	}

	public void setAltura(Altura altura) {
		this.altura = altura;
	}

	public Bloco getBloco() {
		return bloco;
	}

	public String getDescricao() {
		return Descricao;
	}

	public void setDescricao(String descricao) {
		Descricao = descricao;
	}

	public void setBloco(Bloco bloco) {
		this.bloco = bloco;
	}

	public Linha getLinha() {
		return linha;
	}

	public void setLinha(Linha linha) {
		this.linha = linha;
	}

	public String getColuna() {
		return coluna;
	}

	public void setColuna(String coluna) {
		this.coluna = coluna;
	}

	public Enderecamento getEnderecamento() {
		return enderecamento;
	}

	public void setEnderecamento(Enderecamento enderecamento) {
		this.enderecamento = enderecamento;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	public static long getSerialVersionUID() {
		return serialVersionUID;
	}

	public Map<String, Object> notEmptyFields() {
		Map<String, Object> map = new HashMap<String, Object>();
		
		if(!localizacao.isEmpty())
			map.put("localizacao", localizacao);
		
		if(dataMovimentacao!=null)
			map.put("dataMovimentacao", dataMovimentacao);

		if(enderecamento!=null && enderecamento.getId()!=null)
			map.put("enderecamento.codigo", enderecamento.getId());
		
		return map;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		EnderecamentoHistorico other = (EnderecamentoHistorico) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}
